package com.owlike.genson.ext.spring; import java.io.IOException; import java.lang.reflect.Type; import java.nio.charset.Charset; import java.util.Arrays; import com.owlike.genson.*; import org.springframework.core.MethodParameter; import org.springframework.http.HttpInputMessage; import org.springframework.http.HttpOutputMessage; import org.springframework.http.MediaType; import org.springframework.http.converter.AbstractHttpMessageConverter; import org.springframework.http.converter.HttpMessageNotReadableException; import org.springframework.http.converter.HttpMessageNotWritableException; import com.owlike.genson.annotation.WithBeanView; import com.owlike.genson.stream.ObjectWriter; public class GensonMessageConverter extends AbstractHttpMessageConverter<Object> { private final Genson genson; public static final Charset DEFAULT_CHARSET = Charset.forName("UTF-8"); public GensonMessageConverter() { this(new GensonBuilder().setHtmlSafe(true).setSkipNull(true).useBeanViews(true).create()); } public GensonMessageConverter(Genson genson) { super(new MediaType("application", "json", DEFAULT_CHARSET)); this.genson = genson; } @Override protected Object readInternal(Class<?> clazz, HttpInputMessage inputMessage) throws IOException, HttpMessageNotReadableException { MethodParameter mp = ThreadLocalHolder.get("__GENSON$method_param", MethodParameter.class); WithBeanView ann = null; Type type = clazz; if (mp != null) { ann = mp.getMethodAnnotation(WithBeanView.class); type = mp.getGenericParameterType(); } GenericType<?> genericType = GenericType.of(type); if (ann != null) return genson.deserialize(genericType, genson.createReader(inputMessage.getBody()), new Context(genson, Arrays.asList(ann.views()))); else return genson.deserialize(genericType, genson.createReader(inputMessage.getBody()), new Context(genson)); } @Override protected boolean supports(Class<?> clazz) { return true; } @SuppressWarnings("unchecked") @Override protected void writeInternal(Object t, HttpOutputMessage outputMessage) throws IOException, HttpMessageNotWritableException { ObjectWriter writer = genson.createWriter(outputMessage.getBody()); MethodParameter mp = ThreadLocalHolder.get("__GENSON$return_param", MethodParameter.class); WithBeanView ann = mp != null ? mp.getMethodAnnotation(WithBeanView.class) : null; if (ann != null) genson.serialize(t, writer, new Context(genson, Arrays.asList(ann.views()))); else genson.serialize(t, writer, new Context(genson)); writer.flush(); } }